package com.spyz.hbase_api;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;

import java.io.IOException;

public class P3_HBaseDML_2 {
    // 静态属性
    public static Connection connection=P1_HbaseConnection_2.connection;

    /**
     * 插入数据
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @param rowKey    主键
     * @param columnFamily 列族
     * @param columnName 列名
     * @param value 值
     */
    public static void putCell(String namespace, String tableName, String rowKey,String columnFamily,String columnName,String value) throws IOException {

        // 1. 获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        // 2. 调用相关方法插入数据

        // 2.1 创建Put对象
        Put put = new Put(rowKey.getBytes());

        // 2.2 给Put对象添加数据
        put.addColumn(columnFamily.getBytes(),columnName.getBytes(),value.getBytes());

        // 2.3 将对象写入到对应的方法
        try {
            table.put(put);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // 3. 关闭资源
        table.close();

    }

    /**
     * 读取对应的一行的某一列
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @param rowKey    主键
     * @param columnFamily 列族
     * @param columnName 列名
     */
    public static void getCells(String namespace, String tableName, String rowKey,String columnFamily,String columnName) throws IOException {

        // 1. 获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));


        try {

            // 2.创建get对象
            Get get = new Get(rowKey.getBytes());

            // 如果直接调用get方法，此时读一整行数据
            // 如果想读取某一列数据，需要添加对应的参数
            get.addColumn(columnFamily.getBytes(),columnName.getBytes());

            // 设置读取数据的版本
            get.readAllVersions();

            // 读取数据获取 result对象
            Result result = table.get(get);

            // 处理数据
            Cell[] cells = result.rawCells();

            // 测试方法：直接把读取的数据打印到控制台
            // 如果是实际开发，需要额外写方法，对应处理数据

            for (Cell cell : cells) {
                // cell存储的数据比较底层
                String s = new String(CellUtil.cloneValue(cell));
                System.out.println(s);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // 关闭资源
        table.close();

    }

    public static void main(String[] args) throws IOException {

        // 测试添加数据
//        putCell("bigdata","student","1001","info","name","zhang3");

        // 测试读取数据
        getCells("bigdata","student","1001","info","name");

        // 其他代码
        System.out.println("ok");

        // 关闭连接
        P1_HbaseConnection_2.closeConnection();

    }

}
